package com.antrain.utils;

import java.io.File;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

/**
 * dom4j操作的工具类
 */
public class Dom4jUtil {

    /**
     * 通过文件的路径获取xml的document对象
     * @param path 文件的路径
     * @return
     */
    public static Document getXMLByFilePath(String path) {
        if (path==null){
            return null;
        }
        Document document = null;
        try {
            SAXReader reader = new SAXReader();
            document = reader.read(new File(path));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return document;
    }

    /**
     * 获取某文档对象中的某元素内某属性的指和其文本信息
     * @param document xml文档对象
     * @param elementName 元素名
     * @param attrName 属性名
     * @return 
     */
    @SuppressWarnings("unchecked")
    public static Map<String,String> elements2Map(Document document,String elementName, String attrName) {
        List<Element> propList = document.getRootElement().elements(elementName);
        Map <String, String> propConfig = new HashMap<String,String>();
        for (Element element : propList){
            String key = element.attribute(attrName).getValue();
            String value = element.getTextTrim();
            propConfig.put(key, value);     
        }
        return propConfig;
    }

    /**
     * 针对mapper.xml文件，获得映射信息并保存到Map集合中
     * @param document xml文档对象
     * @return
     */
    @SuppressWarnings("unchecked")
    public static Map<String,String> elements2Map(Document document) {
        Element classElement = document.getRootElement().element("class");
        Map<String,String> mapping = new HashMap<String,String>();
        Element idElement = classElement.element("id");
        String idKey  = idElement.attribute("name").getValue();
        String idValue = idElement.attribute("column").getValue();
        mapping.put(idKey, idValue);
        List<Element> propElememnts = classElement.elements("property");
        for (Element element : propElememnts){
            String propKey = element.attribute("name").getValue();
            String propValue = element.attribute("colunm").getValue();
            mapping.put(propKey, propValue);
        }
        return mapping;
    }


    /**
     * 针对mapper.xml文件，获得主键的映射信息并保存到Map集合中
     * @param document xml文档对象
     * @return
     */
    public static Map<String,String> elementsId2Map(Document document) {
        Element classElement = document.getRootElement().element("class");
        Map<String,String> mapping = new HashMap<String,String>();
        Element idElement = classElement.element("id");
        String idKey  = idElement.attribute("name").getValue();
        String idValue = idElement.attribute("column").getValue();
        mapping.put(idKey, idValue);
        return mapping;
    }

    /**
     * 获取某文档对象某元素某属性的值
     * @param document xml文档对象
     * @param elementName   元素名
     * @param attrName 属性名
     * @return
     */
    @SuppressWarnings("unchecked")
    public static Set<String> elements2Set(Document document,String elementName,String attrName){
        List<Element> mappingList = document.getRootElement().elements(elementName);
        Set<String> mappingSet = new HashSet<String>();
        for (Element element : mappingList) {
            String value = element.attribute(attrName).getValue();
            mappingSet.add(value);
        }
        return mappingSet;
    }

    /**
     * 获取某文档对象某元素某属性的第一个值
     * @param document xml文档对象
     * @param elementName   元素名
     * @param attrName 属性名
     * @return
     */
    public static String getPropValue(Document document,String elememtName,String attrName) {
        Element element = (Element)document.getRootElement().elements(elememtName).get(0);
        return element.attribute(attrName).getValue();
    }
}